﻿// 165. 小猫爬山 进阶指南.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;

/*
https://www.acwing.com/problem/content/167/

翰翰和达达饲养了 N 只小猫，这天，小猫们要去爬山。

经历了千辛万苦，小猫们终于爬上了山顶，但是疲倦的它们再也不想徒步走下山了（呜咕>_<）。

翰翰和达达只好花钱让它们坐索道下山。

索道上的缆车最大承重量为 W，而 N 只小猫的重量分别是 C1、C2……CN。

当然，每辆缆车上的小猫的重量之和不能超过 W。

每租用一辆缆车，翰翰和达达就要付 1 美元，所以他们想知道，最少需要付多少美元才能把这 N 只小猫都运送下山？

输入格式
第 1 行：包含两个用空格隔开的整数，N 和 W。

第 2..N+1 行：每行一个整数，其中第 i+1 行的整数表示第 i 只小猫的重量 Ci。

输出格式
输出一个整数，表示最少需要多少美元，也就是最少需要多少辆缆车。

数据范围
1≤N≤18,
1≤Ci≤W≤108
输入样例：
5 1996
1
2
1994
12
29
输出样例：
2
*/


const int N = 20;
long long arr[N];
int n, w;
int ans = 999999;
long long sum[N]; 


void dfs(int u,int k) {
	//当前已经使用的车和已知的最小答案相同 不必继续搜索 无法得到更佳答案了
	if (k >= ans) { return; }

	if (u >= n) {
		ans = min(ans, k);
		return;
	}
	
	//尝试放入某个车内
	for (int i = 0; i < k; i++) {
		if (sum[i] + arr[u] <= w) {
			sum[i] += arr[u];
			dfs(u + 1, k);
			sum[i] -= arr[u];
		}
	}

	//尝试开一个新车
	sum[k] = arr[u]; k++;
	dfs(u + 1, k);
	sum[k] = 0; k--;
}


int main()
{
	cin >> n >> w;

	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	sort(arr,arr+n);
	reverse(arr, arr + n);
	
	int k = 0;;
	dfs(0, k);

	cout << ans << endl;

	return 0;
}

 